package cz.vse.adventura.po1715.xburj54_bursa.gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;


/*******************************************************************************
 * Instance třídy {@code MenuHelp} představují nabídku obsahující nápovědu
 *
 * @author    Jan Bursa
 * @version   1.01
 */
public class MenuHelp extends JMenu
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

     /** GUI, pro které tato instance pracuje. */
    private final GUI_04 gui;

    /** Rozměr okna nápovědy */
    private final Dimension helpWindowSize = new Dimension(800, 500);

    /** Text dialogového okna O programu*/
    private final String INFO_TEXT;

    /** Titulek dialogového okna O programu*/
    private final String INFO_TITLE = "O programu";

//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     */
    public MenuHelp(GUI_04 gui)
    {
        super("Nápověda");
        setMnemonic('N');
        this.gui = gui;
        INFO_TEXT = "Hra Lupič\n" +
                "Autor: " + gui.getAuthor() + "\n" +
                "XNAME: " + gui.getXNAME();

        addItemUserManual();
        addItemAboutApplication();
    }


//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Otevře okno s nápovědou
     */
    private void openManualWindow() {
        /** Okno uživatelské příručky */
        JFrame helpWindow = new JFrame("Nápověda");
                
        /** Výstupní okno, kde hra vypisuje odpověď na uživatelovy příkazy */
        JEditorPane manualOutputArea = new JEditorPane("text/html","");
        manualOutputArea.setEditable(false);
        
        //Vytvoří zobrazení posuvníků v případě potřeby
        JScrollPane scroller = new JScrollPane(manualOutputArea);
        scroller.setPreferredSize(helpWindowSize);
        
        helpWindow.add(scroller, BorderLayout.CENTER);
        
        URL helpURL = gui.getGame().getHelpURL();
        try {
            manualOutputArea.setPage(helpURL);
        } catch (Exception e) {
            throw new RuntimeException(
                "\nNepodařilo se otevřít nápovědu na URL: " + helpURL, e);
        }
        manualOutputArea.addHyperlinkListener(new HLListener(manualOutputArea));

        helpWindow.pack();
        helpWindow.setVisible(true);
    }

    /***************************************************************************
     * Přidá do menu položku Uživatelská příručka
     *
     */
   private void addItemUserManual() {
        JMenuItem item = new JMenuItem("Uživatelská příručka");
        this.add(item);

        item.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e) {
                openManualWindow();
            }
        }
        );
    }

   /***************************************************************************
     * Přidá do menu položku O programu
     *
     */
    private void addItemAboutApplication() {
        JMenuItem aboutApp = new JMenuItem("O programu");
        this.add(aboutApp);

        ActionListener aboutAppListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
               JOptionPane.showMessageDialog(null,
                       INFO_TEXT,
                       INFO_TITLE,
                       JOptionPane.PLAIN_MESSAGE);
            }
        };
        aboutApp.addActionListener(aboutAppListener);
    }

//== INTERNÍ DATOVÉ TYPY =======================================================

    /***************************************************************************
     * Třída realizující posluchače hyperlinků
     * pro potřeby okna uživatelské příručky
     */
    private class HLListener implements HyperlinkListener
    {
    //== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

        private final JEditorPane manualOutputArea;

   //== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

        /***************************************************************************
        *
        */
        HLListener(JEditorPane manualOutput){
            this.manualOutputArea = manualOutput;
        }

   //== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

        /**
        * Called when a hypertext link is updated.
        *
        * @param e the event responsible for the update
        */
        @Override
        public void hyperlinkUpdate(HyperlinkEvent e) {
            URL linkURL = e.getURL();
            if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                try {
                    manualOutputArea.setPage(linkURL);
                } catch (Exception except) {
                throw new RuntimeException(
                    "\nNepodařilo se otevřít nápovědu na URL: " + linkURL, except);
                }
            }
        }
    }
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        MenuHelp inst = new MenuHelp();
//    }
//    public static void main( String[] args )  {  test();  }
}
